package com.general.framework.zzyy.juc;

/**
 *  * 因为wait/notify是依赖于monitor对象存在的，而monitor又依赖于synchronized，所以wait/notify必须和synchronized一起使用。
 *  * 如果去掉synchronized，代码会抛出 `IllegalMonitorStateException` 异常，而且 notify 也不能实现程序的唤醒功能了。


     代码编写要求
 *  * `wait`和`notify`必须再同步块或者方法里面，且成对出现
 *  * 先`wait`再`notify`，顺序不能乱
 */
public class WaitNotifyDemo {
    private static Object objectLock = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                Thread.sleep(3000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            synchronized (objectLock) {
                System.out.println(Thread.currentThread().getName() + "--->come in");
                try {
                    objectLock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "--->被唤醒");
            }
        },"t1").start();
        try {
            Thread.sleep(1);
        }catch (InterruptedException e){
            e.printStackTrace();
        }

        new Thread(() -> {
            synchronized (objectLock) {
                objectLock.notify();
                System.out.println(Thread.currentThread().getName() + "--->发出通知");
            }
        },"t2").start();
    }
}
